/*!
 * \file WtDtPorter.cpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader数据Porter接口实现
 * 
 * \details 本文件实现了WonderTrader数据服务系统的Porter接口，提供跨语言调用支持
 *          主要功能包括：
 *          - 数据服务系统初始化和启动
 *          - 扩展Parser接口实现，支持自定义行情解析器
 *          - 扩展Dumper接口实现，支持自定义数据导出器
 *          - 实时行情数据推送和处理
 *          - 历史数据导出和管理
 *          - Level2数据（订单队列、订单明细、逐笔成交）处理
 *          - 日志记录和版本信息管理
 *          - 跨平台支持和异常处理
 */
#include "WtDtPorter.h"
#include "WtDtRunner.h"

#include "../WtDtCore/WtHelper.h"
#include "../WTSTools/WTSLogger.h"

#include "../Share/ModuleHelper.hpp"
#include "../Includes/WTSVersion.h"

#ifdef _WIN32
#ifdef _WIN64
char PLATFORM_NAME[] = "X64";
#else
char PLATFORM_NAME[] = "X86";
#endif
#else
char PLATFORM_NAME[] = "UNIX";
#endif

#ifdef _MSC_VER
#include "../Common/mdump.h"
#include <boost/filesystem.hpp>
/**
 * @brief 获取模块名称
 * @details 获取当前模块的文件名，主要用于MiniDumper功能
 * @return const char* 模块名称
 */
const char* getModuleName()
{
	static char MODULE_NAME[250] = { 0 };
	if (strlen(MODULE_NAME) == 0)
	{
		GetModuleFileName(g_dllModule, MODULE_NAME, 250);
		boost::filesystem::path p(MODULE_NAME);
		strcpy(MODULE_NAME, p.filename().string().c_str());
	}

	return MODULE_NAME;
}
#endif

/**
 * @brief 获取数据运行器实例
 * @details 获取全局唯一的数据运行器实例，采用单例模式
 * @return WtDtRunner& 数据运行器引用
 */
WtDtRunner& getRunner()
{
	static WtDtRunner runner;
	return runner;
}

/**
 * @brief 初始化数据服务系统
 * @details 初始化WonderTrader数据服务系统，设置配置文件和日志配置，启用异常转储功能
 * @param cfgFile 配置文件路径
 * @param logCfg 日志配置文件路径
 */
void initialize(WtString cfgFile, WtString logCfg)
{
#ifdef _MSC_VER
	CMiniDumper::Enable(getModuleName(), true, WtHelper::get_cwd());
#endif
	getRunner().initialize(cfgFile, logCfg, getBinDir());
}

/**
 * @brief 启动数据服务系统
 * @details 启动WonderTrader数据服务系统，开始数据处理
 * @param bAsync 是否异步启动（默认为false）
 */
void start(bool bAsync/* = false*/)
{
	getRunner().start(bAsync);
}

/**
 * @brief 获取版本信息
 * @details 获取WonderTrader数据服务系统的版本信息，包含平台、版本号、编译时间
 * @return const char* 版本信息字符串
 */
const char* get_version()
{
	static std::string _ver;
	if (_ver.empty())
	{
		_ver = PLATFORM_NAME;
		_ver += " ";
		_ver += WT_VERSION;
		_ver += " Build@";
		_ver += __DATE__;
		_ver += " ";
		_ver += __TIME__;
	}
	return _ver.c_str();
}

/**
 * @brief 写入日志
 * @details 向系统日志写入指定级别的日志信息
 * @param level 日志级别
 * @param message 日志消息
 * @param catName 日志分类名称
 */
void write_log(unsigned int level, const char* message, const char* catName)
{
	if (strlen(catName) > 0)
	{
		WTSLogger::log_raw_by_cat(catName, (WTSLogLevel)level, message);
	}
	else
	{
		WTSLogger::log_raw((WTSLogLevel)level, message);
	}
}

#pragma region "扩展Parser接口"

/**
 * @brief 创建扩展Parser
 * @details 创建一个扩展的行情解析器实例
 * @param id Parser标识符
 * @return bool 创建是否成功
 */
bool create_ext_parser(const char* id)
{
	return getRunner().createExtParser(id);
}

/**
 * @brief 推送行情数据
 * @details 通过扩展Parser推送实时行情数据到数据处理系统
 * @param id Parser标识符
 * @param curTick 当前tick数据
 * @param uProcFlag 处理标志
 */
void parser_push_quote(const char* id, WTSTickStruct* curTick, WtUInt32 uProcFlag)
{
	getRunner().on_ext_parser_quote(id, curTick, uProcFlag);
}

/**
 * @brief 注册Parser回调函数
 * @details 注册扩展Parser的事件回调和订阅回调函数
 * @param cbEvt Parser事件回调函数
 * @param cbSub Parser订阅回调函数
 */
void register_parser_callbacks(FuncParserEvtCallback cbEvt, FuncParserSubCallback cbSub)
{
	getRunner().registerParserPorter(cbEvt, cbSub);
}


#pragma endregion "扩展Parser接口"

#pragma region "扩展Dumper接口"
/**
 * @brief 创建扩展Dumper
 * @details 创建一个扩展的数据导出器实例
 * @param id Dumper标识符
 * @return bool 创建是否成功
 */
bool create_ext_dumper(const char* id)
{
	return getRunner().createExtDumper(id);
}

/**
 * @brief 注册扩展Dumper
 * @details 注册扩展Dumper的K线和tick数据导出回调函数
 * @param barDumper K线数据导出回调函数
 * @param tickDumper tick数据导出回调函数
 */
void register_extended_dumper(FuncDumpBars barDumper, FuncDumpTicks tickDumper)
{
	getRunner().registerExtDumper(barDumper, tickDumper);
}

/**
 * @brief 注册扩展高频数据Dumper
 * @details 注册扩展Dumper的高频数据（订单队列、订单明细、逐笔成交）导出回调函数
 * @param ordQueDumper 订单队列导出回调函数
 * @param ordDtlDumper 订单明细导出回调函数
 * @param transDumper 逐笔成交导出回调函数
 */
void register_extended_hftdata_dumper(FuncDumpOrdQue ordQueDumper, FuncDumpOrdDtl ordDtlDumper, FuncDumpTrans transDumper)
{
	getRunner().registerExtHftDataDumper(ordQueDumper, ordDtlDumper, transDumper);
}
#pragma endregion "扩展Dumper接口"

